package org.linloong.modules.apis.monitor.sync;


import org.linloong.modules.apis.monitor.entity.DeviceInfo;
import org.linloong.modules.apis.monitor.entity.WeatherDataParsed;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Component
public class SensorDataParser {

    /**
     * 解析dataArray与layout匹配的数据，生成WeatherDataParsed列表
     * 规则：serial对应dataArray索引，值=原始值×k + b
     */
    public List<WeatherDataParsed> parse(String rawDataId, String deviceId, Long timestamp,
                                         List<Float> dataArray, List<DeviceInfo.SensorLayout> layout) {
        List<WeatherDataParsed> parsedList = new ArrayList<>();

        for (DeviceInfo.SensorLayout sensor : layout) {
            Integer serial = sensor.getSerial();
            // 校验serial有效性（非空且在dataArray索引范围内）
            if (serial == null || serial < 0 || serial >= dataArray.size()) {
                continue;
            }

            // 获取原始值并计算实际值
            Float rawValue = dataArray.get(serial);
            BigDecimal parsedValue = BigDecimal.valueOf(rawValue);
            // 封装解析结果
            WeatherDataParsed parsed = new WeatherDataParsed();
            parsed.setRawDataId(rawDataId);
            parsed.setSerial(sensor.getSerial());
            parsed.setDeviceId(deviceId);
            parsed.setTimestamp(timestamp);
            parsed.setSensorName(sensor.getName());
            parsed.setSensorType(sensor.getType());
            parsed.setParsedValue(parsedValue);
            parsed.setUnit(sensor.getUnit());
            parsed.setDescription(sensor.getDescription());
            parsed.setParseTime(LocalDateTime.now());

            parsedList.add(parsed);
        }

        return parsedList;
    }
}